package net.chanibal.hala.client;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;


import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.SerializableException;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

public interface Server extends RemoteService {

	String getUserName();

	Boolean isValid();

	Boolean isAdmin();

	public static class Util {
		private static ServerAsync instance;

		public static ServerAsync getInstance() {
			if (instance == null) {
				instance = (ServerAsync) GWT.create(Server.class);
				ServiceDefTarget target = (ServiceDefTarget) instance;
				target.setServiceEntryPoint(GWT.getModuleBaseURL() + "Server");
			}
			return instance;
		}
	}
	
	// Boolean doLogin(String user, String pass, boolean remember) throws
	// Exception;
	// public void rejestruj(String login, String haslo) throws Exception;
	// void doLogout();

	// === akcje z UCD ===

	/**
	 * Logowanie klienta
	 * 
	 * @param login
	 * @param pass
	 * @throws Exception -
	 *             błędy logowania
	 */
	public void doLogin(String login, String pass) throws SerializableException;

	/**
	 * Rejestracja klienta
	 * 
	 * @param login
	 * @param pass
	 * @param age
	 * @param sex
	 *            F lub M
	 * @param address
	 * @param name
	 *            imię
	 * @param familyName
	 *            nazwisko
	 * @throws Exception
	 */
	public void doRegister(String login, String pass, Integer age, char sex, String address, String name, String familyName) throws Exception;

	/**
	 * Wylogowanie klienta lub administratora
	 * @throws SerializableException 
	 */
	public void doLogout() throws SerializableException;

	/**
	 * Stan konta
	 * 
	 * @return
	 * @throws Exception
	 */
	Double getBilling() throws SerializableException;

	/**
	 * Wszystkie imprezy w bazie
	 * 
	 * @return String[][], pola drugiego (po kolei: nazwa, następny termin,
	 *         pozostało terminów, wolnych miejsc, id imprezy)
	 * @throws Exception
	 */
	public String[][] getImprezy() throws SerializableException;

	/**
	 * Rezerwacja imprezy przez klienta, automatycznie dopisuje wszystkie
	 * pozostałe terminy
	 * 
	 * @param imprezaId
	 * @throws Exception 
	 */
	public void doReserve(Integer imprezaId) throws SerializableException;

	/**
	 * Logowanie - wersja dla administratora
	 * 
	 * @param pass
	 * @throws Exception
	 */
	public void doAdminLogin(String pass) throws SerializableException;

	/**
	 * Zwraca listę klientów
	 * 
	 * @return klucz - id, wartość - imię, nazwisko
	 * @throws TorqueException
	 */

	public String[][] getKlienci() throws SerializableException;

	/**
	 * Zwraca dane klienta
	 * 
	 * @param klientId
	 * @return te dane
	 * @throws Exception
	 */
	public KlientData getKlient(String klientLogin) throws SerializableException;

	/**
	 * Bo oklejacze oklejaczy oklejaczy oklejaczy są takie enterpirsey 
	 * @author chanibal
	 */
	public class KlientData implements IsSerializable {

		public String name;
		public String familyName;
		public String address;
		public Integer age;
		public Double bill;
		public String sex;
		public TerminData[] terminy;
		public KlientData() {
		}
		
	}

	public class TerminData implements IsSerializable {
		public Date rozpoczecie;
		public Date zakonczenie;
		public String nazwaImprezy;
		public Integer idImprezy;
		public Integer idTerminu;

		public TerminData() {
		}

	}


	/**
	 * Wpłata dokonana przez klienta
	 * 
	 * @param klientId
	 * @param ile
	 * @throws Exception
	 */
	public void doWplata(String klientLogin, Double ile) throws SerializableException;

	/**
	 * Dodaje imprezę
	 * 
	 * @param tytul
	 * @param kosztZaTermin
	 * @param miejsc
	 * @param terminy
	 *            tablica dwudatowych krotek (rozpoczęcie, koniec)
	 * @throws Exception 
	 */
	public void doAddImpreza(String tytul, Float kosztZaTermin, Integer miejsc, Date terminy[][]) throws SerializableException;

	class ImprezaData implements IsSerializable {
		public String tytul;
		public Double kosztZaTermin;
		public Integer miejsc;
		//public ArrayList terminy;
		public Integer miejscWolnych;
	}
	public ImprezaData getImpreza(Integer id) throws SerializableException;
	public String[][] getImprezaTerminy(Integer id) throws SerializableException;
	
	
}
